﻿using System;

namespace Text.Game
{
    class Program
    {
        static int time;//定义一个随机释放技能的条件
        //创建角色
        static gamer CreateCharacter(gamer gamer)
        {
            //提示
            Console.WriteLine("请输入你的角色名称：");
            //输入角色名称
            gamer.name = Console.ReadLine();
            //判断名称是否正确
            if (string.IsNullOrEmpty(gamer.name))//IsNull0rEmpty方法为判断括号中的变量是否为空
            {
                //给与默认名称
                gamer.name = "懒死你";
            }
            //血量 随机90到111之间的数  Random()是一个类，Next()是Random类中的方法，用来随机一个非负数的整数，其括号里所写的俩个数字是其随机的范围
            gamer.hp = new Random().Next(90, 111);
            //最大血量等于当前血量
            gamer.c_hp = gamer.hp;
            //成长血量
            gamer.g_hp = new Random().Next(7, 12);
            //攻击力
            gamer.atk = new Random().Next(7, 12);
            //成长攻击
            gamer.g_atk = new Random().Next(2, 5);
            //速度
            gamer.speed = new Random().Next(90, 111);
            //成长速度
            gamer.g_speed = new Random().Next(7, 12);
            //给出提示
            Console.WriteLine($"恭喜你！角色创建成功！您的角色名称为：{gamer.name}，血量为：{gamer.hp}，攻击力为：{gamer.atk}，速度为：{gamer.speed}。");
            //总战斗力187-232   <200   200-210 210>
            int num = gamer.hp + gamer.atk + gamer.speed;//总战力
            if (num < 200)//总战力小于200时
            {
                Console.WriteLine("您的角色弱不禁风，建议从新创建");//给出提示
            }
            else if (num < 210)//总战力小于210时
            {
                Console.WriteLine("您的角色普普通通，还可以生存。");//给出提示
            }
            else//其他情况时
            {
                Console.WriteLine("您的角色看起来不同寻常，头上有个环");//给出提示
            }
            //潜力是19-30. 19-23 24-27 28-30
            num = gamer.g_hp + gamer.g_atk + gamer.g_speed;//总潜力值
            if (num <= 23)//总潜力值小于等于23时
            {
                Console.WriteLine("您的角色看起来有点蠢");//给出提示
            }
            else if (num < 27)//总潜力值小于等于27时
            {
                Console.WriteLine("您的角色看起来平平常常");//给出提示
            }
            else//其他情况时
            {
                Console.WriteLine("您的角色看起来潜力无限");//给出提示
            }
            //显示当前属性
            ShowInfo(gamer);
            return gamer;
        }
        //进入新手村
        static gamer xinShouCun(gamer gamer)
        {
            //给出引导
            Console.WriteLine("您的前方有一名乞丐，另外一侧站着一名富贵人员，您要与谁对话？");
            Console.WriteLine("1、乞丐   2、富豪   3、谁都不理");
            //输入选项的数字
            string str = Console.ReadLine();
            //判断
            if (str == "1")//如果输入的是1
            {
                //乞丐
                if (new Random().Next(0, 100) > 70)//相当于29%的概率
                {
                    //残废
                    gamer.c_hp -= 30;//属性减少
                    //速度
                    gamer.speed -= 5;//属性减少
                    //提示
                    Console.WriteLine("乞丐拿出一本绝世武功，可惜没领悟！血量减少30！");
                }
                else
                {
                    //成长提升
                    gamer.g_hp += 5;//属性增加
                    gamer.g_atk += 1;//属性增加
                    gamer.g_speed += 5;//属性增加
                    //提示
                    Console.WriteLine("乞丐拿出一本绝世武功，你练完后，感觉神清气爽，各项属性增加");
                }

            }
            else if (str == "2")
            {
                //富豪
                if (new Random().Next(0, 100) > 70)
                {
                    //赚钱了
                    gamer.money += 20;//属性增加
                    //提示
                    Console.WriteLine("富豪看你面善，送了你20两银子，出去历练");
                }
                else
                {
                    //血本无归
                    gamer.money -= 9;//属性减少
                    //提示
                    Console.WriteLine("富豪心情不好，叫手下打了你一顿，损失了9两银子T T");
                }
            }
            //离开新手村提示
            Console.WriteLine("在村民的棍棒下，你离开了新手村，向长安进发！");
            //显示当前属性
            ShowInfo(gamer);
            return gamer;
        }
        //查看信息
        static void ShowInfo(gamer gamer)
        {
            Console.WriteLine($"您现在的属性为level:{gamer.level} hp:{gamer.c_hp}/{gamer.hp},atk:{gamer.atk},speed:{gamer.speed},money:{gamer.money}，exp:{gamer.c_exp}/{gamer.exp}");//显示当前属性
        }
        //野外
        static gamer jiaoQu(gamer gamer)
        {
            //提示
            Console.WriteLine("村口站着一名背着行囊的商人，是否对话？1、对话 2、抢劫 3、无视");//给与提示
            string str = Console.ReadLine();//输入选项的数字
            if (str == "1")
            {
                //对话
                Console.WriteLine("商人笑眯眯的看着你，说道;'只要给我20两，就能让你脱胎换骨！'是否给与？1、给 2、不给");//给与提示
                //输入
                string str2 = Console.ReadLine();//输入选项的数字
                if (str2 == "1" && gamer.money >= 20)//如果选择1并且钱够的话
                {
                    //扣钱
                    gamer.money -= 20;//属性减少
                    //加属性
                    gamer.g_hp += 10;//属性增加
                    gamer.g_atk += 2;//属性增加
                    gamer.g_speed += 8;//属性增加
                    gamer.c_exp += 20;//属性增加

                    Console.WriteLine("经过商人的锻炼，你感觉全身充满了力量！");//给与提示
                    ShowInfo(gamer);//显示当前属性
                }
                else//其他情况下
                {
                    Console.WriteLine("商人鄙视的看了你一眼，丫的光看不掏钱");//给与提示
                }
            }
            else if (str == "2")//如果选择抢劫
            {
                //抢劫
                int num = gamer.hp + gamer.atk + gamer.speed;
                //如果战斗力大于210，天资聪慧者，抢劫都能成功
                if (num > 210)
                {
                    Console.WriteLine("你拿出了一把杀猪刀，商人落荒而逃，掉落了30两银子，获得了一百点经验， 恭喜你！抢劫成功！！");//给与提示
                    gamer.money += 30;//属性增加
                    gamer.c_exp += 100;//属性增加
                    if (gamer.c_exp >= gamer.exp)//如果当前经验值大于或等于最大经验值，则等级升级
                    {
                        gamer = Up(gamer);//等级升级方法
                    }
                }
                else//如果抢劫失败
                {
                    gamer.money = 0;//属性减少 金钱归零
                    gamer.c_hp -= 30;//属性减少
                    Console.WriteLine("你太弱了，连商人都打不过，快删号吧");//给与提示
                }
            }
            else//选择无视
            {
                if (new Random().Next(0, 100) > 70)//相当于29%的概率
                {
                    gamer.money += 10;//属性增加
                    Console.WriteLine("你无视了商人，商人离开了，但是他貌似掉下了一个物品，你走上前去查看，是一个钱袋，你得到了10两银子");//给与提示
                    ShowInfo(gamer);//显示当前属性
                }

            }
            return gamer;
        }
        //路遇野猪
        static gamer monster(gamer gamer, monster mon, region re)
        {
            Console.WriteLine("你在丛林里走了一段路以后，突然在前方发现一头野猪。1、攻击 2、绕路行走");//给与提示
            //输入选项的数字
            string str1 = Console.ReadLine();
            //如果输入的是1
            if (str1 == "1")
            {
                Console.WriteLine("开始攻击");//给与提示
                bool live = true;//设置一个while循环的条件,默认为true
                while (live)//开始循环
                {
                    //随机1-4  Random().Next()的特性在左边的数字和右边的数字范围内，可以取左边的数字，但不可以取右边的数字，要取右边数字-1的数字
                    time = new Random().Next(1, 5);
                    //如果玩家的速度大于野怪的速度，则玩家先出手
                    if (gamer.speed > mon.pigspeed)
                    {
                        //switch语句，条件为上面随机的time
                        switch (time)
                        {
                            //如果为1时
                            case 1:
                                //野怪的血量减去玩家攻击力
                                mon.pigHp -= gamer.atk;
                                //给与提示
                                Console.WriteLine("你攻击了野猪，野猪收到了" + gamer.atk + "点伤害，剩余血量" + mon.pigHp);//给与提示
                                //玩家血量减去野怪攻击力
                                gamer.c_hp -= mon.pigAtk;
                                //给与提示
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                //case末尾必须的词；C# 代码中case不能贯穿到下一个case需要写一个break；
                                break;
                            //如果为2时
                            case 2:
                                //野怪的血量减去玩家技能一的攻击力
                                mon.pigHp -= re.skillAtk1;
                                //给与提示
                                Console.WriteLine("你使用" + re.skillName1 + "攻击了野猪，野猪收到了" + re.skillAtk1 + "点伤害，剩余血量" + mon.pigHp);
                                //玩家血量减去野怪攻击力
                                gamer.c_hp -= mon.pigAtk;
                                //给与提示
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                break;
                            //如果为3时     
                            case 3:
                                //野怪的血量减去玩家技能二的攻击力
                                mon.pigHp -= re.skillAtk2;
                                //给与提示
                                Console.WriteLine("你使用" + re.skillName2 + "攻击了野猪，野猪收到了" + re.skillAtk2 + "点伤害，剩余血量" + mon.pigHp);
                                //玩家血量减去野怪攻击力
                                gamer.c_hp -= mon.pigAtk;
                                //给与提示
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                break;
                            //如果为3时
                            case 4:
                                //野怪的血量减去玩家技能三的攻击力
                                mon.pigHp -= re.skillAtk3;
                                //给与提示
                                Console.WriteLine("你使用" + re.skillName3 + "攻击了野猪，野猪收到了" + re.skillAtk3 + "点伤害，剩余血量" + mon.pigHp);
                                //玩家血量减去野怪攻击力
                                gamer.c_hp -= mon.pigAtk;
                                //给与提示
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                break;
                        }

                    }
                    else//如果玩家的速度小于野怪的速度，则野怪先出手
                    {
                        //switch语句，条件为上面随机的time
                        switch (time)
                        {
                            //同上，只不过这次是怪物先攻击
                            case 1:
                                gamer.c_hp -= mon.pigAtk;
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                mon.pigHp -= gamer.atk;
                                Console.WriteLine("你攻击了野猪，野猪收到了" + gamer.atk + "点伤害，剩余血量" + mon.pigHp);
                                break;
                            case 2:
                                gamer.c_hp -= mon.pigAtk;
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                mon.pigHp -= re.skillAtk1;
                                Console.WriteLine("你使用" + re.skillName1 + "攻击了野猪，野猪收到了" + re.skillAtk1 + "点伤害，剩余血量" + mon.pigHp);
                                break;
                            case 3:
                                gamer.c_hp -= mon.pigAtk;
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                mon.pigHp -= re.skillAtk2;
                                Console.WriteLine("你使用" + re.skillName2 + "攻击了野猪，野猪收到了" + re.skillAtk2 + "点伤害，剩余血量" + mon.pigHp);
                                break;
                            case 4:
                                gamer.c_hp -= mon.pigAtk;
                                Console.WriteLine("你受到了野猪的" + mon.pigAtk + "点攻击伤害，剩余血量" + gamer.c_hp);
                                mon.pigHp -= re.skillAtk3;
                                Console.WriteLine("你使用" + re.skillName3 + "攻击了野猪，野猪收到了" + re.skillAtk3 + "点伤害，剩余血量" + mon.pigHp);
                                break;
                        }
                    }
                    //如果人物当前血量小于等于0
                    if (gamer.c_hp <= 0)
                    {
                        live = false;//执行while的条件为false，不再进入循环
                        Console.WriteLine("您已经死亡");//给与提示
                    }
                    //如果怪物当前血量小于等于0
                    else if (mon.pigHp <= 0)
                    {
                        live = false;//执行while的条件为false，不再进入循环
                        Console.WriteLine("您已成功击杀野猪！！！,获得了180点经验和30两银子");//给与提示
                        gamer.c_exp += 180;//属性增加
                        gamer.money += 30;//属性增加
                        gamer = Up(gamer);//执行升级方法
                    }
                }
            }
            else if (str1 == "2")//如果选择绕开野怪
            {
                gamer.c_hp -= 30;//属性值减少
                Console.WriteLine("您绕开了野猪，但是你在绕开野猪的路上踩到了猎人打猎的陷阱，收到了30点伤害");//给与提示
                ShowInfo(gamer);//显示玩家信息
            }
            return gamer;
        }
        //回血
        static gamer BloodReturn(gamer gamer)
        {
            if (gamer.c_hp < 30)//如果当前血量小于30点血
            {
                Console.WriteLine("您的血量不足30点，是否花费银两回血   1、回  2不回");//给与提示
                string str2 = Console.ReadLine();//输入选项数字
                if (str2 == "1")//如果选择1
                {
                    gamer.c_hp = gamer.hp;//回血
                    gamer.money -= 5;//扣钱
                }
                else//选择不回血
                {
                    Console.WriteLine("残血你还浪，迟早要出事！！！");//给与提示
                }
            }
            return gamer;
        }
        //升级
        static gamer Up(gamer gamer)
        {
            gamer.level += 1;//等级+1
            gamer.hp += gamer.g_hp;//属性增加
            gamer.c_hp = gamer.hp;//当前血量回复到最大血量
            gamer.atk += gamer.g_atk;//属性增加
            gamer.speed += gamer.g_speed;//属性增加
            gamer.c_exp -= 100;//当前经验减去升级所需经验
            gamer.exp += 100;//最大经验值增加100
            Console.WriteLine("恭喜你升级了！！！");//给与提示
            ShowInfo(gamer);//显示信息
            return gamer;
        }

        static void Main(string[] args)
        {
            gamer g = new gamer();
            monster pig = new monster();
            region re = new region();
            //创建角色
            g = CreateCharacter(g);
            //进入新手村
            g = xinShouCun(g);
            //野外
            g = jiaoQu(g);
            //路遇野猪
            g = monster(g, pig,re);
            //回血
            g = BloodReturn(g);
        }
    }
}